/**
 * 数据录入权限管理工具
 * 
 * 权限规则：
 * - 设计用户：只能录入数据来源为 E 的数据
 * - 采购用户：只能录入数据来源为 P 的数据  
 * - 施工用户：只能录入数据来源为 C、O、R 的数据
 * - 管理员：可以录入全部数据
 */

// 类型定义
type UserRole = 'admin' | 'designer' | 'design' | 'procurement' | 'purchase' | 'construction' | 'guest';
type DataSource = 'E' | 'P' | 'C' | 'O' | 'R';

/**
 * 判断用户是否有权限录入指定数据来源的数据
 * @param userRole 用户角色
 * @param dataSource 数据来源
 * @returns 是否有权限录入
 */
export function canEditByRole(userRole: string, dataSource: string): boolean {
  // 管理员可以录入所有数据
  if (userRole === 'admin') {
    return true;
  }
  
  // 设计用户只能录入 E 来源的数据
  if (userRole === 'designer' || userRole === 'design') {
    return dataSource === 'E';
  }
  
  // 采购用户只能录入 P 来源的数据
  if (userRole === 'procurement' || userRole === 'purchase') {
    return dataSource === 'P';
  }
  
  // 施工用户可以录入 C、O、R 来源的数据
  if (userRole === 'construction') {
    return ['C', 'O', 'R'].includes(dataSource);
  }
  
  // 默认无权限
  return false;
}

/**
 * 获取用户可以录入的数据来源列表
 * @param userRole 用户角色
 * @returns 可录入的数据来源数组
 */
export function getAllowedDataSources(userRole: string): DataSource[] {
  switch (userRole) {
    case 'admin':
      return ['E', 'P', 'C', 'O', 'R'];
    case 'designer':
    case 'design':
      return ['E'];
    case 'procurement':
    case 'purchase':
      return ['P'];
    case 'construction':
      return ['C', 'O', 'R'];
    default:
      return [];
  }
}

/**
 * 获取权限描述文本
 * @param userRole 用户角色
 * @returns 权限描述
 */
export function getPermissionDescription(userRole: string): string {
  switch (userRole) {
    case 'admin':
      return '管理员 (可录入所有数据来源的数据)';
    case 'designer':
    case 'design':
      return '设计用户 (仅可录入数据来源为 E 的数据)';
    case 'procurement':
    case 'purchase':
      return '采购用户 (仅可录入数据来源为 P 的数据)';
    case 'construction':
      return '施工用户 (仅可录入数据来源为 C、O、R 的数据)';
    default:
      return '未知角色 (无录入权限)';
  }
}

/**
 * 过滤用户可以录入的数据行
 * @param data 数据数组
 * @param userRole 用户角色
 * @param dataSourceField 数据来源字段名
 * @returns 过滤后的数据
 */
export function filterEditableData<T extends Record<string, any>>(
  data: T[], 
  userRole: string, 
  dataSourceField: string = 'dataSource'
): T[] {
  if (userRole === 'admin') {
    return data; // 管理员可以看到所有数据
  }
  
  const allowedSources = getAllowedDataSources(userRole);
  
  return data.filter(item => {
    const dataSource = item[dataSourceField] || item['数据来源'] || item.source || '';
    return allowedSources.includes(dataSource);
  });
}

/**
 * 检查数据行是否可编辑（用于UI禁用状态）
 * @param userRole 用户角色
 * @param dataSource 数据来源
 * @param isLocked 是否锁定状态
 * @returns 是否禁用编辑
 */
export function isEditDisabled(userRole: string, dataSource: string, isLocked: boolean = false): boolean {
  return isLocked || !canEditByRole(userRole, dataSource);
}

/**
 * 获取输入框的禁用样式类名
 * @param userRole 用户角色
 * @param dataSource 数据来源
 * @param isLocked 是否锁定状态
 * @returns CSS类名字符串
 */
export function getInputDisabledClass(userRole: string, dataSource: string, isLocked: boolean = false): string {
  const disabled = isEditDisabled(userRole, dataSource, isLocked);
  
  if (disabled) {
    return 'border-gray-200 bg-gray-50 text-gray-600 cursor-not-allowed';
  }
  
  return 'border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20';
}
